package cn.edu.scnu.semart.goods.service;

import cn.edu.scnu.semart.model.goods.Comment;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * 商品评论Service接口
 */
public interface CommentService extends IService<Comment> {

    /**
     * 添加评论
     * @param comment 评论信息
     * @return 是否成功
     */
    boolean addComment(Comment comment);

    /**
     * 根据商品ID分页查询评论
     * @param goodsId 商品ID
     * @param page 分页参数
     * @return 评论列表
     */
    IPage<Comment> getCommentsByGoodsId(Integer goodsId, Page<Comment> page);

    /**
     * 根据用户ID分页查询评论
     * @param userId 用户ID
     * @param page 分页参数
     * @return 评论列表
     */
    IPage<Comment> getCommentsByUserId(Integer userId, Page<Comment> page);

    /**
     * 删除评论
     * @param id 评论ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean deleteComment(Integer id, Integer userId);

    /**
     * 点赞评论
     * @param commentId 评论ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean likeComment(Integer commentId, Integer userId);

    /**
     * 取消点赞评论
     * @param commentId 评论ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean unlikeComment(Integer commentId, Integer userId);

    /**
     * 获取用户收到的评价分页列表
     * @param userId 被评价的用户ID（卖家ID）
     * @param page 分页参数
     * @return 评价分页数据
     */
    IPage<Comment> getReceivedComments(Integer userId, Page<Comment> page);

    /**
     * 获取用户收到的评分平均数
     * @param userId 用户ID（卖家ID）
     * @return 平均评分
     */
    Double getUserAverageRating(Integer userId);

    /**
     * 获取商品评论统计
     * @param goodsId 商品ID
     * @return 评论统计信息
     */
    CommentStatistics getCommentStatistics(Integer goodsId);

    /**
     * 评论统计信息
     */
    class CommentStatistics {
        private Integer totalCount;
        private Integer fiveStarCount;
        private Integer fourStarCount;
        private Integer threeStarCount;
        private Integer twoStarCount;
        private Integer oneStarCount;
        private Double averageRating;

        // getter和setter方法
        public Integer getTotalCount() { return totalCount; }
        public void setTotalCount(Integer totalCount) { this.totalCount = totalCount; }
        public Integer getFiveStarCount() { return fiveStarCount; }
        public void setFiveStarCount(Integer fiveStarCount) { this.fiveStarCount = fiveStarCount; }
        public Integer getFourStarCount() { return fourStarCount; }
        public void setFourStarCount(Integer fourStarCount) { this.fourStarCount = fourStarCount; }
        public Integer getThreeStarCount() { return threeStarCount; }
        public void setThreeStarCount(Integer threeStarCount) { this.threeStarCount = threeStarCount; }
        public Integer getTwoStarCount() { return twoStarCount; }
        public void setTwoStarCount(Integer twoStarCount) { this.twoStarCount = twoStarCount; }
        public Integer getOneStarCount() { return oneStarCount; }
        public void setOneStarCount(Integer oneStarCount) { this.oneStarCount = oneStarCount; }
        public Double getAverageRating() { return averageRating; }
        public void setAverageRating(Double averageRating) { this.averageRating = averageRating; }
    }
} 